
//参数解析
// #include <iostream>
// #include <string>
// #include <vector>
// using namespace std;
// int main()
// {
//     string str;
//     vector<string> vec;
//     getline(cin, str);
    
//     auto fast = str.begin();
//     auto last = str.begin();
    
//     while (fast != str.end())
//     {
//         while (fast != str.end() && *fast == ' ')
//             ++fast;
//         last = fast;
//         if (*fast == '\"')
//         {
//             last = ++fast;
//             while(fast != str.end() && *fast != '\"')
//                 ++fast;
//             vec.push_back(string(last, fast));
//         }
//         else 
//         {
//             while (fast != str.end() && *fast != ' ')
//                 ++fast;
//             vec.push_back(string(last, fast));
            
//         }
//         if (fast != str.end())
//             ++fast;
//         last = fast;
//     }
    
//     cout << vec.size() << endl;
//     for (const auto& s : vec)
//     {
//         cout << s << endl;
//     }
    
//     return 0;
// }

//跳石板
#include <iostream>
#include <vector>
#include <climits>
#include <cmath>
using namespace std;

void getAppr(vector<int>& appr, int n)
{
    int sqrn = sqrt(n);
    for (int i = 2; i<=sqrn; ++i)
    {
        if (n % i == 0)
        {
            appr.push_back(i);
            if (n/i != i)
            {
                appr.push_back(n/i);
            }
        }
    }
}

int Jump(int n, int m)
{
    vector<int> step(m+1, INT_MAX);
    step[n] = 0;

    for (int i = n; i<m; ++i)
    {
        //获取约数
        vector<int> appr;
        getAppr(appr, i);

        for (int j = 0; j<appr.size(); ++j)
        {
            if (i+appr[j] <= m)
            {
                step[i+appr[j]] = min(step[i]+1, step[i+appr[j]]);
            }
        }
    }

    if (step[m] != INT_MAX)
        return step[m];
    else 
        return -1;
}

int main()
{
    int n, m;
    cin >> n >> m;

    cout << Jump(n, m) << endl;

    return 0;
}